package com.MediaVaultTest;

import java.util.Iterator;
import java.util.LinkedList;
import com.MediaVaultTest.Media;

public class Sort {

	private LinkedList<Media> listOfMedia;
	private LinkedList<Media> tempList;
	
	public Sort(LinkedList<Media> listFromUser){
		listOfMedia = listFromUser;
		tempList = new LinkedList<Media>();
	}
	
	public LinkedList<Media> sortBy(String field, String order){
		if(field!=null&&order!=null){
			//Also sorting don't work if their are no files, no figure
			if(listOfMedia.size()!=0){
				if(field.equals("Title")) sortByTitle(order);
				if(field.equals("Artist")) sortByArtist(order);
				if(field.equals("Album")) sortByAlbum(order);
				if(field.equals("Genre")) sortByGenre(order);
				if(field.equals("Rating")) sortByRating(order);
				if(field.equals("Language")) sortByLanguage(order);
				if(field.equals("Series")) sortBySeries(order);
				if(field.equals("Size")) sortBySize(order);
			}
		}
		return tempList;
	}
	
	public LinkedList<Media> search(String field, String entry){
		if(field!=null&&entry!=null){
			if(field.equals("Title")) searchByTitle(entry);
			if(field.equals("Artist")) searchByArtist(entry);
			if(field.equals("Album")) searchByAlbum(entry);
			if(field.equals("Genre")) searchByGenre(entry);
			if(field.equals("Language")) searchByLanguage(entry);
			if(field.equals("Series")) searchBySeries(entry);
		}
		return tempList;
	}
	
	private void searchBySeries(String entry) {
		for(int i = 0; i < listOfMedia.size(); i++){
			if(listOfMedia.get(i).getSeries().toLowerCase().contains(entry.toLowerCase())){
				tempList.add(listOfMedia.get(i));
			}
		}
	}

	private void searchByLanguage(String entry) {
		for(int i = 0; i < listOfMedia.size(); i++){
			if(listOfMedia.get(i).getLanguage().toLowerCase().contains(entry.toLowerCase())){
				tempList.add(listOfMedia.get(i));
			}
		}
	}

	private void searchByGenre(String entry) {
		for(int i = 0; i < listOfMedia.size(); i++){
			if(listOfMedia.get(i).getGenre().toLowerCase().contains(entry.toLowerCase())){
				tempList.add(listOfMedia.get(i));
			}
		}
	}

	private void searchByAlbum(String entry) {
		for(int i = 0; i < listOfMedia.size(); i++){
			if(listOfMedia.get(i).getAlbum().toLowerCase().contains(entry.toLowerCase())){
				tempList.add(listOfMedia.get(i));
			}
		}
	}

	private void searchByArtist(String entry) {
		for(int i = 0; i < listOfMedia.size(); i++){
			if(listOfMedia.get(i).getArtist().toLowerCase().contains(entry.toLowerCase())){
				tempList.add(listOfMedia.get(i));
			}
		}
	}

	private void searchByTitle(String entry) {
		for(int i = 0; i < listOfMedia.size(); i++){
			if(listOfMedia.get(i).getTitle().toLowerCase().contains(entry.toLowerCase())){
				tempList.add(listOfMedia.get(i));
			}
		}
	}

	public LinkedList<Media> getMediaOfType(String type){
		if(type.equals("Music")) getMusic();
		if(type.equals("Photo")) getPhotos();
		if(type.equals("Movie")) getMovies();
		if(type.equals("TV")) getTV();
		return tempList;
	}
	
	private void getTV() {
		for(int i = 0; i < listOfMedia.size(); i++){
			if(listOfMedia.get(i).getMediaType().equals("TV")){
				tempList.add(listOfMedia.get(i));
			}
		}
	}

	private void getMovies() {
		for(int i = 0; i < listOfMedia.size(); i++){
			if(listOfMedia.get(i).getMediaType().equals("Movie")){
				tempList.add(listOfMedia.get(i));
			}
		}
	}

	private void getPhotos() {
		for(int i = 0; i < listOfMedia.size(); i++){
			if(listOfMedia.get(i).getMediaType().equals("Photo")){
				tempList.add(listOfMedia.get(i));
			}
		}
	}

	private void getMusic() {
		for(int i = 0; i < listOfMedia.size(); i++){
			if(listOfMedia.get(i).getMediaType().equals("Music")){
				tempList.add(listOfMedia.get(i));
			}
		}
	}

	public LinkedList<Media> sortByTitle(String order){
		if(order.equals("asc")){
			tempList.add(listOfMedia.getFirst());
				for(int i = 1; i < listOfMedia.size(); i++){
					int y = 0;
					while(listOfMedia.get(i).getTitle().compareTo(tempList.get(y).getTitle()) > 0){
						y++;
						if(y==tempList.size()){
							break;
						}
					}
					tempList.add(y, listOfMedia.get(i));
				}
				return tempList;
			} else //desc
	{
		tempList.add(listOfMedia.getFirst()); 
		for(int i = 1; i < listOfMedia.size(); i++){
			int y = 0;
	 		while(listOfMedia.get(i).getTitle().compareTo(tempList.get(y).getTitle()) < 0){
				y++;
				if(y==tempList.size()){
					break;
				}
			}
			tempList.add(y, listOfMedia.get(i));
		}
		return tempList;}
	}
		
	//sort by artist	
	public LinkedList<Media> sortByArtist(String order){
			if(order.equals("asc")){
				tempList.add(listOfMedia.getFirst());
					for(int i = 1; i < listOfMedia.size(); i++){
						int y = 0;
						while(listOfMedia.get(i).getArtist().compareTo(tempList.get(y).getArtist()) > 0){
							y++;
							if(y==tempList.size()){
								break;
							}
						}
						tempList.add(y, listOfMedia.get(i));
					}
					return tempList;
				} else //desc
		{
			tempList.add(listOfMedia.getFirst());
			for(int i = 1; i < listOfMedia.size(); i++){
				int y = 0;
				while(listOfMedia.get(i).getArtist().compareTo(tempList.get(y).getArtist()) < 0){
					y++;
					if(y==tempList.size()){
						break;
					}
				}
				tempList.add(y, listOfMedia.get(i));
			}
			return tempList;
		}
	}
		//sort by album
		public LinkedList<Media> sortByAlbum(String order){
			if(order.equals("asc")){
				tempList.add(listOfMedia.getFirst());
					for(int i = 1; i < listOfMedia.size(); i++){
						int y = 0;
						while(listOfMedia.get(i).getAlbum().compareTo(tempList.get(y).getAlbum()) > 0){
							y++;
							if(y==tempList.size()){
								break;
							}
						}
						tempList.add(y, listOfMedia.get(i));
					}
					return tempList;
				} else //desc
		{
			tempList.add(listOfMedia.getFirst());
			for(int i = 1; i < listOfMedia.size(); i++){
				int y = 0;
				while(listOfMedia.get(i).getAlbum().compareTo(tempList.get(y).getAlbum()) < 0){
					y++;
					if(y==tempList.size()){
						break;
					}
				}
				tempList.add(y, listOfMedia.get(i));
			}
			return tempList;
		}
	}
		
		//sort by genre
		public LinkedList<Media> sortByGenre(String order){
			if(order.equals("asc")){
				tempList.add(listOfMedia.getFirst());
					for(int i = 1; i < listOfMedia.size(); i++){
						int y = 0;
						while(listOfMedia.get(i).getGenre().compareTo(tempList.get(y).getGenre()) > 0){
							y++;
							if(y==tempList.size()){
								break;
							}
						}
						tempList.add(y, listOfMedia.get(i));
					}
					return tempList;
				} else //desc
		{
			tempList.add(listOfMedia.getFirst());
			for(int i = 1; i < listOfMedia.size(); i++){
				int y = 0;
				while(listOfMedia.get(i).getGenre().compareTo(tempList.get(y).getGenre()) < 0){
					y++;
					if(y==tempList.size()){
						break;
					}
				}
				tempList.add(y, listOfMedia.get(i));
			}
			return tempList;
		}
	}
		//sort by language
		public LinkedList<Media> sortByLanguage(String order){
			if(order.equals("asc")){
				tempList.add(listOfMedia.getFirst());
					for(int i = 1; i < listOfMedia.size(); i++){
						int y = 0;
						while(listOfMedia.get(i).getLanguage().compareTo(tempList.get(y).getLanguage()) > 0){
							y++;
							if(y==tempList.size()){
								break;
							}
						}
						tempList.add(y, listOfMedia.get(i));
					}
					return tempList;
				} else //desc
		{
			tempList.add(listOfMedia.getFirst());
			for(int i = 1; i < listOfMedia.size(); i++){
				int y = 0;
				while(listOfMedia.get(i).getLanguage().compareTo(tempList.get(y).getLanguage()) < 0){
					y++;
					if(y==tempList.size()){
						break;
					}
				}
				tempList.add(y, listOfMedia.get(i));
			}
			return tempList;
		}
	}
		//sort by series
		public LinkedList<Media> sortBySeries(String order){
			if(order.equals("asc")){
				tempList.add(listOfMedia.getFirst());
					for(int i = 1; i < listOfMedia.size(); i++){
						int y = 0;
						while(listOfMedia.get(i).getSeries().compareTo(tempList.get(y).getSeries()) > 0){
							y++;
							if(y==tempList.size()){
								break;
							}
						}
						tempList.add(y, listOfMedia.get(i));
					}
					return tempList;
				} else //desc
		{
			tempList.add(listOfMedia.getFirst());
			for(int i = 1; i < listOfMedia.size(); i++){
				int y = 0;
				while(listOfMedia.get(i).getSeries().compareTo(tempList.get(y).getSeries()) < 0){
					y++;
					if(y==tempList.size()){
						break;
					}
				}
				tempList.add(y, listOfMedia.get(i));
			}
			return tempList;
		}
	}
		//sort by rating (no compareTo)
		public LinkedList<Media> sortByRating(String order){
			if(order.equals("asc")){
				tempList.add(listOfMedia.getFirst());
					for(int i = 1; i < listOfMedia.size(); i++){
						int y = 0;
						while(listOfMedia.get(i).getRating()>tempList.get(y).getRating()){
							y++;
							if(y==tempList.size()){
								break;
							}
						}
						tempList.add(y, listOfMedia.get(i));
					}
					return tempList;
				} else //desc
		{
			tempList.add(listOfMedia.getFirst());
			for(int i = 1; i < listOfMedia.size(); i++){
				int y = 0;
				while(listOfMedia.get(i).getRating()<tempList.get(y).getRating()){
					y++;
					if(y==tempList.size()){
						break;
					}
				}
				tempList.add(y, listOfMedia.get(i));
			}
			return tempList;
		}
	}
		
		//sort by size
		public LinkedList<Media> sortBySize(String order){
			if(order.equals("asc")){
				tempList.add(listOfMedia.getFirst());
					for(int i = 1; i < listOfMedia.size(); i++){
						int y = 0;
						while(listOfMedia.get(i).getFirstFormat().getSize()>tempList.get(y).getFirstFormat().getSize()){
							y++;
							if(y==tempList.size()){
								break;
							}
						}
						tempList.add(y, listOfMedia.get(i));
					}
					return tempList;
				} else //desc
		{
			tempList.add(listOfMedia.getFirst());
			for(int i = 1; i < listOfMedia.size(); i++){
				int y = 0;
				while(listOfMedia.get(i).getFirstFormat().getSize()<tempList.get(y).getFirstFormat().getSize()){
					y++;
					if(y==tempList.size()){
						break;
					}
				}
				tempList.add(y, listOfMedia.get(i));
			}
			return tempList;
		}
	}
}
